package netlib
import (
	"reflect"
	"message"
	"github.com/golang/protobuf/proto"
	"github.com/name5566/leaf/log"
	"github.com/name5566/leaf/gate"
)

// 序列化为rpc包
func Serialize(msgID message.MSG, msg interface{}) (interface{}) {
	rpcResponse := &message.RPCResponse{}
	rpcResponse.MsgID = msgID.Enum()
	rpcResponse.ErrCode = message.ErrorCode_OK.Enum()

	if msg != nil {
		buffer, err := proto.Marshal(msg.(proto.Message))
		if err != nil {
			log.Error("Serialize error:  %v  %v", msgID, err)
			return rpcResponse
		}
		rpcResponse.Data = buffer
	}

	return rpcResponse
}

func SerializeError(msgID message.MSG, errCode message.ErrorCode, errMsg string) (interface{}) {
	rpcResponse := &message.RPCResponse{}
	rpcResponse.MsgID = msgID.Enum()
	rpcResponse.ErrCode = errCode.Enum()

	if errMsg != "" {
		rpcResponse.ErrMsg = proto.String(errMsg)
	}

	return rpcResponse
}

// 反序列化rpc包
func Deserialize(rpc interface{}, msgType interface{}) (interface{}) {
	m := rpc.(*message.RPCRequest)
	data := m.Data
	msg := reflect.New(reflect.TypeOf(msgType)).Interface()
	err := proto.Unmarshal(data, msg.(proto.Message))

	if err != nil {
		log.Error("Deserialize error")
	}
	return msg
}

// 发送消息
func SendMsg(agent interface{}, msgID message.MSG, msg interface{}) {
	a := agent.(gate.Agent)
	a.WriteMsg(Serialize(msgID, msg))
}

func SendError(agent interface{}, msgID message.MSG, errCode message.ErrorCode) {
	log.Debug("SendError: %v", errCode)
	a := agent.(gate.Agent)
	a.WriteMsg(SerializeError(msgID, errCode, ""))
}

func SendErrorMsg(agent interface{}, msgID message.MSG, errCode message.ErrorCode, errMsg string) {
	a := agent.(gate.Agent)
	a.WriteMsg(SerializeError(msgID, errCode, errMsg))
}
